package com.gper.edu.mytrait

/**
 * scala的特质(trait) 相当于Java的接口和抽象类  因此在scala中没有implements关键字
 * 特质的声明 :
 *      trait TraitName {
 *        trait body
 *      }
 *  TraitName以大写字母开头
 *
 *  scala中trait的使用 :
 *   1. 没有父类 :
 *      class 类名  extends 特质1 with 特质2 with 特质3 ...
 *   2. 有父类 :
 *      class 类名 extends 父类 with 特质1 with 特质2 ...
 *
 *
 */

object ScalaTraitDemo {
  def main(args: Array[String]): Unit = {
    val bird = new Bird
    bird.fly

    val duck = new Duck
    duck.swimming

    val myBird = new MyBird("麻雀")
    myBird.fly
  }
}

/**
 * 声明一个飞行特质类
 * 富接口 : 一个特质中有抽象方法，也有非抽象方法
 */
trait FlyBehavior{
  def fly()
  def sayHi(): Unit ={
    println("hello world")
  }
}

trait SwimBehavior{
  def swimming()
  def sayHi(): Unit ={
    println("hello world")
  }
}
/**
 * 动物的父类
 */
class Animal {

}

/**
 * 鸟类
 */
class Bird extends Animal with FlyBehavior{
  override def fly(): Unit = {
    println("鸟会飞行.")
  }
}

/**
 * 鸭子类
 */
class Duck extends Animal  with SwimBehavior{
  override def swimming(): Unit = {
    println("鸭子会游泳.")
  }
}

class RubberDuck extends Animal {

}
/**
 * 没有父类,使用trait特质
 * @param name
 */
class Fly(name:String) extends FlyBehavior{

  override def fly(): Unit = {
    println(name+"会飞行.")
  }
}

/**
 * 没有父类
 * @param name
 */
class Swimming(name:String) extends SwimBehavior{

  override def swimming(): Unit = {
    println(name+"会游泳.")
  }
}

class MyBird(name:String) extends Fly(name:String){

}